package com.huanf.task;

import com.huanf.pojo.JdData;
import com.huanf.service.DataService;
import com.huanf.utils.MyHttpUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: 35238
 * 功能: 定时任务，每隔一段时间就去爬取(下载)京东的商品数据
 * 时间: 2023-11-13 00:30
 */
@Component
public class DataTask {

    @Value("${pa.searchKeyword}")
    private String key;

    @Value("${pa.totalPage}")
    private Integer page;

    @Autowired
    //MyHttpUtil是我们写的类
    private MyHttpUtil myHttpUtil;

    @Autowired
    //DataService是我们写的接口
    private DataService xxdataService;

    @Scheduled(fixedDelay = 1000*60*60*24)//单位是毫秒，例如这里表示每隔一天执行一次xxdownloadTask方法
    public void xxdownloadTask(){



        //注意京东的页数规律是1、3、5、7、9。例如我们要下载5页，用循环即可
        for (int i = 1; i < page; i=i+2) {

            //目标网址
            String url = "https://search.jd.com/Search?keyword="+key+"&page="+i;

            System.out.println("下一页: " + url);

            //解析页面，获取商品数据，并存储
            xxparse(url);
        }
        System.out.println("京东 --相关的商品数据抓取完成");
    }

    //解析页面，获取商品数据，并存储
    private void xxparse(String xxurl){

        //由于京东限制必须登录才能爬取，所以先正常去京东官网登录，然后F12打开控制台，复制cookie
        //爬取成功的图片会放在D盘的biliDownload文件夹(自己提前把这个文件夹建出来)，需要停止程序运行然后图片才能显示
        Map<String, String> cookies = new HashMap<>();
        cookies.put("thor","62DF4962BF28EACBFE728B20A6A2E023D58F549D47A8EAE6F092137DE3DD033B9E36189C2EE86DC64D1BEF869E870286A5C9BCE6C53F756B7EDE345D9575CE87B9BD84CCD5B8489FAF5A8A5B2C4AA1F428361986506520554D5E67794212A3814B468900B0E951C8B27F7FBB0A5096A2C3A383C830772545712AAB8F1C5219F9");

        //解析html，获取Document对象。要带上你自己的cookie去登录。cookie是有时效的，如果爬取失败就去京东正常登录拿到新cookie复制过来
        Document document = null;
        try {
            document = Jsoup.connect(xxurl).cookies(cookies).get();
        } catch (IOException e) {
            System.out.println("cookie已失效，请更换自己新登录后的cookie");
        }
        System.out.println(document.html());

        //找id为J_goodsList的div标签，的每个ul，的每个li
        Elements spuEles = document.select("div#J_goodsList > ul > li");

        if (spuEles != null && !spuEles.isEmpty()) {
            System.out.println("爬取频繁 !!! 京东对接口进行了管控，请1小时后再尝试");
        }

        //遍历每一个li
        for (Element spuEle : spuEles) {

            //找data-sku属性
            long sku = Long.parseLong(spuEle.attr("data-sku"));

            //找data-spu属性
            String isNotNull = spuEle.attr("data-spu");
            Long spuTemp = null;
            if (isNotNull ==""){
                spuTemp = Long.parseLong("0");
            } else {
                spuTemp = Long.parseLong(spuEle.attr("data-spu"));
            }
            Long spu = spuTemp;


            //根据sku查询商品数据，如果商品在本地电脑已经存在，就不需要下载，直接进入下一次遍历
            JdData jdData = new JdData();
            jdData.setSku(sku);
            List<JdData> list = xxdataService.xxfindAll(jdData);
            if (list.size() > 0) {
                continue;
            }

            //如果商品不在本地电脑，就保存在本地电脑，例如将title、price、pic、url、ceated、updated信息保存在本地电脑
            jdData.setSpu(spu);
            //商品详情页面的url。保存url
            String dataUrl = "https://item.jd.com/" + sku + ".html";
            jdData.setUrl(dataUrl);
            //保存pic
            String picUrl = "https:" + spuEle.getElementsByTag("img").eq(0).attr("data-lazy-img");
            picUrl = picUrl.replace("/n7/","/n1/");
            System.out.println("爬取到的图片地址: "+picUrl);
            String picName = myHttpUtil.xxGetImage(picUrl);
            jdData.setPic(picName);

            //保存price
            String price = spuEle.getElementsByClass("p-price").eq(0).text();
            jdData.setPrice(price);
            ////保存title
            String title = spuEle.getElementsByClass("p-name").eq(0).text();
            jdData.setTitle(title);

            //保存ceated
            jdData.setCreated(new Date());
            //保存updated
            jdData.setUpdated(jdData.getCreated());

            //把所有商品数据存入数据库
            xxdataService.xxsave(jdData);

        }
    }
}
